//
//  UIFont+XWXRuntime.m
//  templateProject
//
//  Created by Mr_hi on 2019/10/19.
//  Copyright © 2019 zwhl. All rights reserved.
//

#import "UIFont+XWXRuntime.h"
#import <objc/runtime.h>

/***
 class_getInstanceMethod得到类的实例方法
 class_getClassMethod得到类的类方法
 1. 首先需要创建一个UIFont的分类
 2. 自己UI设计原型图的手机尺寸宽度
 */

#define MyUIScreen 375 // UI设计原型图的手机尺寸宽度(6s), 6p的--414

@implementation UIFont (XWXRuntime)

/**
 外部正常调用系统设置字体的方法就行，他就会根据屏幕宽度进行设置字体大小
 注意⚠️：
 1.load方法只会走一次，利用runtime的method进行方法的替换
 2.替换的方法里面（把系统的方法替换成我们自己写的方法），这里要记住写自己的方法，不然会死循环
 3.之后凡是用到systemFontOfSize方法的地方，都会被替换成我们自己的方法，即可改字体大小了
 4.注意：此方法只能替换 纯代码 写的控件字号，如果你用xib创建的控件且在xib里面设置的字号，那么替换不了！你需要在xib的
 awakeFromNib方法里面手动设置下控件字体
 */

+ (void)load {
    // 获取自定义的类方法
    Method newMethod = class_getClassMethod([self class], @selector(adjustFont:));
    // 获取系统的类方法
    Method method = class_getClassMethod([self class], @selector(systemFontOfSize:));
    // 然后交换类方法，交换两个方法的IMP指针，(IMP代表了方法的具体的实现）
    method_exchangeImplementations(newMethod, method);
}

+ (UIFont *)adjustFont:(CGFloat)fontSize {
    UIFont *newFont = nil;
    // 下面其实就是调用系统方法(因为是交换了方法，所以你需要使用哪个方法，那你就要调用其对立的那个方法)
    newFont = [UIFont adjustFont:fontSize * [UIScreen mainScreen].bounds.size.width/MyUIScreen];
    
    return newFont;
}


@end
